package cc.rengu.redp.bizimpl.upmp.service;

import cc.rengu.redp.bizimpl.upmp.domain.UpmpUserInfo;
import cc.rengu.redp.bizimpl.upmp.vo.UpmpUserInfoVO;
import cc.rengu.redp.common.domain.QueryRequest;
import cc.rengu.redp.common.exception.RedpException;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * @author System
 */
public interface IUpmpUserInfoService extends IService<UpmpUserInfo> {

    /**
     * 通过用户名查找用户
     *
     * @param username username
     * @return user
     */
    UpmpUserInfo findByName(String username);

    /**
     * 通过用户id查找用户
     *
     * @param id 用户表id
     * @return user
     */
    UpmpUserInfo findById(String id);

    /**
     * 通过用户id查找用户
     *
     * @param id 用户表id
     * @return user
     */
    UpmpUserInfoVO findVOById(String id);

    /**
     * 通过用户 userId 查找用户
     *
     * @param userId userId
     * @return user
     */
    UpmpUserInfo findByUserId(String instId,String userId);

    /**
     * 通过用户 userType+loginId 查找用户
     *
     * @param userType
     * @return loginId
     */
    UpmpUserInfo findByLoginId(String userType,String loginId);

    /**
     * 查询用户详情，包括基本信息，用户角色，用户部门
     *
     * @param user         user
     * @param queryRequest queryRequest
     * @return IPage
     */
    IPage<UpmpUserInfoVO> findUserPage(UpmpUserInfoVO user, QueryRequest queryRequest) throws RedpException;

    /**
     * 查询单个用户信息
     * @param userId
     * @return
     */
    UpmpUserInfoVO findDetail(String userId);

    /**
     * 更新用户登录时间
     *
     * @param user 用户
     */
    void updateLoginTime(UpmpUserInfo user) throws Exception;

    /**
     * 新增用户
     *
     * @param user user
     */
    void createUser(UpmpUserInfoVO user) throws Exception;

    /**
     * 修改用户
     *
     * @param user user
     */
    void updateUser(UpmpUserInfoVO user) throws Exception;

    /**
     * 删除用户
     *
     * @param userIds 用户 id数组
     */
    void deleteUsers(String[] userIds) throws Exception;

    /**
     * 更新个人信息
     *
     * @param user 个人信息
     */
    void updateProfile(UpmpUserInfo user) throws Exception;

    /**
     * 更新用户头像
     *
     * @param userId   用户id
     * @param avatar   用户头像
     */
    void updateAvatar(String userId, String avatar) throws Exception;

    /**
     * 更新用户密码
     *
     * @param username 用户名
     * @param password 新密码
     */
    void updatePassword(String username, String password) throws Exception;

    /**
     * 注册用户
     *
     * @param username 用户名
     * @param password 密码
     */
    void regist(String username, String password) throws Exception;

    /**
     * 重置密码
     *
     * @param usernames 用户集合
     */
    void resetPassword(String[] ids) throws Exception;

    /**
     * 获取所有用户
     * @return
     */
    List<UpmpUserInfo> getAllUsers();

    /**
     * 根据登录账户获取某个用户
     * @param instId
     * @param userType
     * @param loginId
     * @return
     */
    UpmpUserInfoVO findUpmpUserInfoVO(String instId,String userType,String loginId)throws RedpException;

    /**
     * 根据登录账户获取某个用户
     * @param instId
     * @param userType
     * @param loginId
     * @return
     */
    UpmpUserInfo findUpmpUserInfo(String instId,String userType,String loginId)throws RedpException;


    /**
     * 根据机构id获取机构编码及下级机构编码，组成以逗号分隔的字符串
     *
     * @param orgCode
     * @return
     */
    public String findUserOrgCodes(String orgCode, String instId) throws RedpException;

    /**
     * 新增时校验用户登录账户是否存在
     * @param instId
     * @param loginId
     * @return
     */
    List<UpmpUserInfo> queryUserByLoginId(String instId, String loginId);
}
